/***
	********************
	*	@file  	key.c
	*	@version V1.0
	*  @date    2023-3-14
	*	@author  反客科技
	*	@brief   按键接口相关函数
   ********************
   *  @description
	*
	*	实验平台：反客STM32F407ZGT6核心板 （型号：FK407M2-ZGT6）
	*	淘宝地址：https://shop212360197.taobao.com
	*	QQ交流群：536665479
	*
>>>>> 文件说明：
	*
	*  初始化按键引脚，配置为上拉输入
	*
	********************
***/

#include "key.h"
#include "main.h"

/********************
 *	函 数 名:	KEY_Init
 *	入口参数:	无
 *	返 回 值:无
 *	函数功能:	初始化按键引脚
 *	说    明:配置为上拉输入
 ********************/

//void KEY_Init(void)
//{
//    GPIO_InitTypeDef GPIO_InitStruct = {0};
//
//    __HAL_RCC_KEY_CLK_ENABLE; // 开启时钟
//
//    GPIO_InitStruct.Pin = KEY_PIN;			// 按键引脚
//    GPIO_InitStruct.Mode = GPIO_MODE_INPUT; // 输入模式
//    GPIO_InitStruct.Pull = GPIO_PULLUP;		// 上拉
//
//    HAL_GPIO_Init(KEY_PORT, &GPIO_InitStruct);
//}

/********************
 *	函 数 名:	KEY_Scan
 *	入口参数:	无
 *	返 回 值:KEY_ON - 按键按下，KEY_OFF - 按键放开
 *	函数功能:	按键扫描
 *	说    明:周期性调用该函数，根据返回值判断状态
 ********************/

//轮询方式扫描4个按键,返回按键值
//timeout单位ms，若timeout=0表示一直扫描，直到有键按下
KEYS ScanPressedKey(uint32_t timeout)
{
    KEYS key=KEY_NONE;
    uint32_t  tickStart = HAL_GetTick();  //当前计数值
    const uint32_t  btnDelay=20;	//按键按下阶段的抖动，延时再采样时间
    // GPIO_PinState keyState;

    while(1)
    {
        if(HAL_GPIO_ReadPin(KeyLeft_GPIO_Port, KeyLeft_Pin) == GPIO_PIN_RESET) {
            HAL_Delay(btnDelay);
            if(HAL_GPIO_ReadPin(KeyLeft_GPIO_Port, KeyLeft_Pin) == GPIO_PIN_RESET) {
                return KEY_LEFT;
            }
        }

        if(HAL_GPIO_ReadPin(KeyRight_GPIO_Port, KeyRight_Pin) == GPIO_PIN_RESET) {
            HAL_Delay(btnDelay);
            if(HAL_GPIO_ReadPin(KeyRight_GPIO_Port, KeyRight_Pin) == GPIO_PIN_RESET) {
                return KEY_RIGHT;
            }
        }

        if(HAL_GPIO_ReadPin(KeyUp_GPIO_Port, KeyUp_Pin) == GPIO_PIN_RESET) {
            HAL_Delay(btnDelay);
            if(HAL_GPIO_ReadPin(KeyUp_GPIO_Port, KeyUp_Pin) == GPIO_PIN_RESET) {
                return KEY_UP;
            }
        }

        if(HAL_GPIO_ReadPin(KeyDown_GPIO_Port, KeyDown_Pin) == GPIO_PIN_RESET) {
            HAL_Delay(btnDelay);
            if(HAL_GPIO_ReadPin(KeyDown_GPIO_Port, KeyDown_Pin) == GPIO_PIN_RESET) {
                return KEY_DOWN;
            }
        }

        if(HAL_GPIO_ReadPin(KeyMid_GPIO_Port, KeyMid_Pin) == GPIO_PIN_RESET) {
            HAL_Delay(btnDelay);
            if(HAL_GPIO_ReadPin(KeyMid_GPIO_Port, KeyMid_Pin) == GPIO_PIN_RESET) {
                return KEY_MID;
            }
        }

        if(HAL_GPIO_ReadPin(WakeUp_GPIO_Port, WakeUp_Pin) == GPIO_PIN_SET) {
            HAL_Delay(btnDelay);
            if(HAL_GPIO_ReadPin(WakeUp_GPIO_Port, WakeUp_Pin) == GPIO_PIN_SET) {
                return KEY_WAKE;
            }
        }

        if (timeout != KEY_WAIT_ALWAYS)  //没有按键按下时，会计算超时，timeout时退出
        {
            if ((HAL_GetTick() - tickStart) > timeout)
                break;
        }
    }

    return	key;
}

